<!DOCTYPE html>
<html lang="zh-Hans">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Array Cardio 💪</title>
</head>
<body>
    <p><em>请按 F12 查看 Console 面板</em> 💁</p>
    <p>若无结果请刷新试试</p>

    <script>

    // 准备用于练习的数据
    // 定义 inventors、flavours、people、data 四个常量，各自赋值为一个包含数据的列表

    const inventors = [
      { first: 'Albert', last: 'Einstein', year: 1879, passed: 1955 },
      { first: 'Isaac', last: 'Newton', year: 1643, passed: 1727 },
      { first: 'Galileo', last: 'Galilei', year: 1564, passed: 1642 },
      { first: 'Marie', last: 'Curie', year: 1867, passed: 1934 },
      { first: 'Johannes', last: 'Kepler', year: 1571, passed: 1630 },
      { first: 'Nicolaus', last: 'Copernicus', year: 1473, passed: 1543 },
      { first: 'Max', last: 'Planck', year: 1858, passed: 1947 },
      { first: 'Katherine', last: 'Blodgett', year: 1898, passed: 1979 },
      { first: 'Ada', last: 'Lovelace', year: 1815, passed: 1852 },
      { first: 'Sarah E.', last: 'Goode', year: 1855, passed: 1905 },
      { first: 'Lise', last: 'Meitner', year: 1878, passed: 1968 },
      { first: 'Hanna', last: 'Hammarström', year: 1829, passed: 1909 }
    ];

    // Array.prototype.filter()
    // 1. Filter the list of inventors for those who were born in the 1500's
	// 筛选出 16 世纪出生的人
    console.log("筛选出 16 世纪出生的人：");
    const fifteen = inventors.filter(function(inventor) {
        if (inventor.year >= 1500 && inventor.year < 1600 ) {
            return true;
        }
    });
    console.table(fifteen);

    // if 语句可以省略
    const _fifteen = inventors.filter(function(inventor) {
        return inventor.year >= 1500 && inventor.year < 1600;
    });
    console.table(_fifteen);

    // 可用箭头函数重写
    const __fifteen = inventors.filter(inventor =>(inventor.year >= 1500 && inventor.year < 1600));
    console.table(__fifteen);

    // Array.prototype.map()
    // 2. Give us an array of the inventors' first and last names
	// 展示发明家的姓名
    console.log("展示发明家的姓名：");
	const fullNames = inventors.map(inventor => inventor.first + ' ' + inventor.last);
    console.log(fullNames);

    // 可用模板字面量重写
	const _fullNames = inventors.map(inventor => `${inventor.first} ${inventor.last}`);
    console.log(_fullNames);

    // Array.prototype.sort()
    // 3. Sort the inventors by birthdate, oldest to youngest
	// 把这些人从大到小进行排序
//	  const ordered = inventors.sort(function(firstName, secondName) {
//		  if(firstName.year > secondName.year) {
//			  return 1;  //	  对 sort 函数，返回值为 -1 排在前面，1 排在后面
//		  } else {
//			  return -1;
//		  }
//	  });
//	  console.table(ordered);

    // 按最早出生到最晚出生排序
    console.log("按最早出生到最晚出生排序：");
	const __ordered = inventors.sort((a, b) => (a.year > b.year) ? 1 : -1);
	console.table(__ordered);

    // 按最晚出生到最早出生排序
    console.log("按最晚出生到最早出生排序：");
	const ordered = inventors.sort((a, b) => (a.year > b.year) ? -1 : 1);
	console.table(ordered);

    // 5. Sort the inventors by years lived
    // 从活得最长的开始排
    console.log("从活得最长的开始排：");
    const oldest = inventors.sort(function(a, b) {
      const lastInventor = a.passed - a.year;
      const nextInventor = b.passed - b.year;
      return lastInventor > nextInventor ? -1 : 1;
  }); // lastInventor 要放在前面，与 a 对应
    console.table(oldest);

    // 7. sort Exercise
    // Sort the people alphabetically by last name
	// 按照姓氏的字母进行排序
    console.log("按照姓氏的字母进行排序：");
	const sortName = inventors.sort( (a, b) => {
		return (a.last > b.last) ? 1 : -1;
	})
	console.table(sortName);

    // Array.prototype.reduce()
    // 4. How many years did all the inventors live
	// 他们所有人一共活了多少岁
	// 下面三种写法是一样的效果
    console.log("所有人一共活了多少岁：");
	var total = 0;
	for(var i = 0; i < inventors.length; i++) {
		total += inventors[i].passed - inventors[i].year;
	}
	console.log(total);

    // total 是累加器？？？inventor 是数组中的每个元素
	var totalYears = inventors.reduce(function(total, inventor) {
		return total + inventor.passed - inventor.year;
	}, 0);
	console.log(totalYears);

    const totalYear = inventors.reduce( (total, inventor) => {
		return total + inventor.passed - inventor.year;
	}, 0);
	console.log(totalYear);

    // 6. create a list of Boulevards in Paris that contain 'de' anywhere in the name
    // https://en.wikipedia.org/wiki/Category:Boulevards_in_Paris

    // 打开上面的网页。然后输入下面的语句，就可以筛选出页面中含有 'de' 这个词的所有街道的名称

    // const category = document.querySelector('.mw-category');
    // const links = Array.from(category.querySelectorAll('a'));
    // const de = links
    //             .map(link => link.textContent)
    //             .filter(streetName => streetName.includes('de'));

    const flavours = ['Chocolate Chip', 'Kulfi', 'Caramel Praline', 'Chocolate', 'Burnt Caramel', 'Pistachio', 'Rose', 'Sweet Coconut', 'Lemon Cookie', 'Toffeeness', 'Toasted Almond', 'Black Raspberry Crunch', 'Chocolate Brownies', 'Pistachio Almond', 'Strawberry', 'Lavender Honey', 'Lychee', 'Peach', 'Black Walnut', 'Birthday Cake', 'Mexican Chocolate', 'Mocha Almond Fudge', 'Raspberry'];

    const people = ['Beck, Glenn', 'Becker, Carl', 'Beckett, Samuel', 'Beddoes, Mick', 'Beecher, Henry', 'Beethoven, Ludwig', 'Begin, Menachem', 'Belloc, Hilaire', 'Bellow, Saul', 'Benchley, Robert', 'Benenson, Peter', 'Ben-Gurion, David', 'Benjamin, Walter', 'Benn, Tony', 'Bennington, Chester', 'Benson, Leana', 'Bent, Silas', 'Bentsen, Lloyd', 'Berger, Ric', 'Bergman, Ingmar', 'Berio, Luciano', 'Berle, Milton', 'Berlin, Irving', 'Berne, Eric', 'Bernhard, Sandra', 'Berra, Yogi', 'Berry, Halle', 'Berry, Wendell', 'Bethea, Erin', 'Bevan, Aneurin', 'Bevel, Ken', 'Biden, Joseph', 'Bierce, Ambrose', 'Biko, Steve', 'Billings, Josh', 'Biondo, Frank', 'Birrell, Augustine', 'Black Elk', 'Blair, Robert', 'Blair, Tony', 'Blake, William'];

    // 7. sort Exercise
    // Sort the people alphabetically by last name
    // 按照姓氏的字母进行排序
    console.log("按照姓氏的字母进行排序：");
    const alpha = people.sort((lastOne, nextOne) => {
      const [aFirst, aLast] = lastOne.split(', ');
      const [bFirst, bLast] = nextOne.split(', ');
      return aLast > bLast ? 1 : -1;
    });
    console.log(alpha);

    const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck' ];

    // 8. Reduce Exercise
    // Sum up the instances of each of these
    // 统计各个物品的数量
    console.log("统计各个物品的数量：");
    const transportation = data.reduce(function(obj, item) {
      if (!obj[item]) {
        obj[item] = 0;
      }
      obj[item]++;
      return obj;
    }, {});

    console.log(transportation);

    </script>
</body>
</html>
